package com.qf.utils;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolUtils {

    /**
     * int corePoolSize, 核心线程数  5
     * int maximumPoolSize, 最大线程数   10
     * long keepAliveTime, 超出核心线程数的线程存活时间  2
     * TimeUnit unit, 存活时间对应的时间单位   s
     * BlockingQueue<Runnable> workQueue, 等待队列  100
     * ThreadFactory threadFactory, 线程工厂  default
     * RejectedExecutionHandler handler  拒绝策略  abort
     *
     *  来了3个任务，分配3个核心线程执行任务
     *  又来了3个任务，分配2个核心线程去执行任务，1个任务进入等待队列等待
     *  又来了100任务，99个任务进入等待队列等待，此时最大线程数-核心线程数还有5个剩余，创建一个新的线程执行任务
     *  又来了5个任务，此时最大线程数-核心线程数还有4个剩余，创建4个新的线程执行任务，剩下还有一个直接拒绝
     *
     *  当任务执行完成后，大线程数-核心线程数还有5个差值，这5个线程会在线程池中存活2s后，被回收。
     */
    private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5,
            5,
            0,
            TimeUnit.SECONDS,
            new LinkedBlockingQueue<>(),
            Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.AbortPolicy()
    );


    public static ThreadPoolExecutor getThreadPool(){
        return threadPoolExecutor;
    }
}
